#pragma once
#include <iostream>
#include <string>
#include <mutex>
#include <vector>
#include <memory>
#include <unordered_map>
using namespace std;

// 用户类 - 管理用户信息
class User
{
public:
    User(int socket, const string &username = "");

    int getSocket() const;
    string getUsername() const;
    void setUsername(const string &username);
    bool isOnline() const;
    void setOffline();

private:
    int socket;      // 用户的socket
    string username; // 用户名
    bool online;     // 在线状态
};

// 用户管理模块 - 管理所有用户
class UserManager
{
public:
    void addUser(int socket, const string &username);

    void removeUser(int socket);

    shared_ptr<User> getUser(int socket);

    vector<shared_ptr<User>> getAllUsers();

private:
    unordered_map<int, shared_ptr<User>> users;
    mutex _mutex;
};
